const Service = require('egg').Service;

class HotnewsService extends Service {
  async find(page = 1, pageSize = 10) {
    const { ctx } = this;
    const offset = (page - 1) * pageSize;
    const sql = 'select * from hotnews where thumbnail != "" order by created_at desc limit ? offset ? ';
    const countSql = 'select count(*) as total from hotnews where thumbnail != ""';
    const result = await ctx.db.query(sql, [pageSize, offset]);
    const countResult = await ctx.db.query(countSql);
    const total = countResult[0].total;

    return {
      total,
      rows: result
    };
  }

  async findOne(key) {
    const { ctx } = this;
    return await ctx.db.get('hotnews_details', { uniquekey: key });
  }
  //通过聚合api获取头条数据
  async fetchHotnewsByJuhe() {
    const { ctx, logger } = this;
    const res = await ctx.curl('http://v.juhe.cn/toutiao/index', {
      method: 'get',
      dataType:'json',
      contentType: 'json',
      data: {
        key: process.env.JUHE_KEY,
        type: 'caijing',
        page: 1,
        page_size: 10, //每次查询10条
        is_filter: 1  //过滤无图
      }
    });

    //如果不存在数据
    if (res.data.error_code !== 0) {
      logger.error(res.data.reason);
      return
    }
    
    //便利返回结果，插入数据库
    const rd = res.data.result.data.map(item => {
      return {
        uniquekey: item.uniquekey,
        title: item.title,
        author: item.author_name,
        thumbnail: item.thumbnail_pic_s,
        url: item.url,
        created_at: item.date
      }
    });
    // 将抓取的数据插入到数据库中
    // 1、删除数据库中数据,
    //await ctx.app.mysql.delete('hotnews');
    // 2、插入数据
    // await ctx.app.mysql.insert('hotnews', data);

    // 3、遍历data获取单条新闻详情并保存数据库
    for (let i = 0; i < rd.length; i++) {
      const item = rd[i];

      /**---------1、新闻列表表插入--------------**/
      //判断是否已经存在，若已经存在跳过
      const exist1 = await ctx.app.mysql.get('hotnews', { uniquekey: item.uniquekey });
      if (!exist1) {
        await ctx.app.mysql.insert('hotnews', item);
      }

      /**---------2、新闻详情表插入--------------**/
      //判断是否已经存在，若已经存在跳过
      const exist2 = await ctx.app.mysql.get('hotnews_details', { uniquekey: item.uniquekey });
      if (!exist2) {
        // 获取新闻详情
        const { result ,error_code, reason} = await this.getNewsDetail(item.uniquekey);
        //如果查询报错
        if(error_code !== 0) {
          logger.error(reason);
          return
        }
        // 插入数据库
        await ctx.app.mysql.insert('hotnews_details', {
          uniquekey: item.uniquekey,  //此处注意必须是新闻列表的uniquekey
          title: result.detail.title,
          date: result.detail.date,
          author_name: result.detail.author_name,
          content: result.content
        })
      }
    }
  }

  //获取新闻详情
  async getNewsDetail(key) {
    const { ctx } = this;
    const res = await ctx.curl('http://v.juhe.cn/toutiao/content', {
      method: 'get',
      dataType: 'json',
      contentType: 'json',
      data: {
        key: process.env.JUHE_KEY,
        uniquekey: key,
      }
    });
    return res.data;
  }
  //抓取数据：爬虫
  async fetch() {
    const { ctx } = this;
    //TODO:通过调用聚合接口获取新闻数据
    // 构建查询条件
    // const brower = await puppeteer.launch({
    //   executablePath: 'C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe',
    //   headless: true
    // });
    // const page = await brower.newPage();
    // await page.goto('https://news.baidu.com/widget?id=PicWall');
    // await page.waitForSelector('.image-list-wrapper')
    // const result = await page.evaluate(() => {
    //   const items = document.querySelectorAll('.image-list-wrapper .image-list-item');
    //   return Array.from(items).map(item => {
    //     const title = item.querySelector('.txt').innerText;
    //     const img = item.querySelector('img').src;
    //     return {
    //       title,
    //       img
    //     }
    //   })
    // })
    // await brower.close();
    // console.log(result);
    //将抓取的数据插入到数据库中
    //1、删除数据库中数据
    // await ctx.app.mysql.delete('hotnews');
    //2、插入数据
    // await ctx.app.mysql.insert('hotnews', result);
  }
}

module.exports = HotnewsService;